/**
 * 创建演示知识库数据
 */

import Knowledge, { KnowledgeType, KnowledgeStatus } from '../models/Knowledge';
import User from '../models/User';
import logger from '@utils/logger';

export async function seedKnowledge(): Promise<void> {
  try {
    // 检查是否已存在演示数据
    const existingKnowledge = await Knowledge.countDocuments();

    if (existingKnowledge > 0) {
      logger.info('Demo knowledge already exists, skipping creation');
      return;
    }

    // 获取管理员用户作为作者
    const adminUser = await User.findOne({ username: 'admin' });

    if (!adminUser) {
      logger.warn('Admin user not found, skipping knowledge seeding');
      return;
    }

    const knowledgeData = [
      {
        title: 'CPU 使用率过高问题排查手册',
        summary: '当服务器 CPU 使用率超过 80% 时的标准排查流程和解决方案',
        content: `
## 问题现象
服务器 CPU 使用率持续超过 80%，系统响应缓慢

## 排查步骤

### 1. 查看 CPU 占用进程
\`\`\`bash
top -c
ps aux --sort=-%cpu | head -n 10
\`\`\`

### 2. 分析进程详情
\`\`\`bash
pidstat -u 1 5
\`\`\`

### 3. 检查系统负载
\`\`\`bash
uptime
vmstat 1 5
\`\`\`

## 常见原因

1. **应用程序死循环或内存泄漏**
2. **数据库查询效率低下**
3. **定时任务冲突**
4. **恶意进程或挖矿程序**

## 解决方案

### 临时措施
- 重启占用过高的进程
- 调整进程优先级：\`renice -n 10 -p PID\`

### 长期优化
- 优化应用程序代码
- 增加服务器资源
- 实施负载均衡

## 预防措施
- 设置告警阈值
- 定期性能测试
- 代码审查
        `,
        type: KnowledgeType.TROUBLESHOOTING,
        status: KnowledgeStatus.PUBLISHED,
        category: '系统性能',
        tags: ['CPU', '性能优化', '故障排查'],
        author: adminUser._id,
        authorName: adminUser.fullName,
        relatedAlerts: ['HighCPUUsage', 'SystemOverload'],
      },
      {
        title: '内存使用率告警处理最佳实践',
        summary: '内存使用率告警的分析方法和处理建议',
        content: `
## 告警说明
当系统可用内存低于 20% 时触发告警

## 快速诊断

### 查看内存使用情况
\`\`\`bash
free -h
cat /proc/meminfo
\`\`\`

### 查看进程内存占用
\`\`\`bash
ps aux --sort=-%mem | head -n 10
pmap -x PID
\`\`\`

## 常见场景

### 1. 正常业务高峰
- 特征：内存使用稳定增长后趋于平稳
- 处理：观察即可，如持续增长则需干预

### 2. 内存泄漏
- 特征：内存持续增长不释放
- 处理：重启应用，分析代码查找泄漏点

### 3. Cache 占用过多
- 特征：cached 内存占用高
- 处理：可通过 \`sync && echo 3 > /proc/sys/vm/drop_caches\` 清理

## 建议
- 设置合理的内存告警阈值（建议 80%）
- 配置 swap 空间作为缓冲
- 定期重启应用释放内存
        `,
        type: KnowledgeType.BEST_PRACTICE,
        status: KnowledgeStatus.PUBLISHED,
        category: '系统性能',
        tags: ['内存', '告警处理', '最佳实践'],
        author: adminUser._id,
        authorName: adminUser.fullName,
        relatedAlerts: ['HighMemoryUsage', 'OutOfMemory'],
      },
      {
        title: '数据库连接池耗尽问题解决方案',
        summary: '数据库连接池满导致应用无法连接的排查和解决',
        content: `
## 问题表现
- 应用报错：Too many connections
- 数据库连接数达到上限
- 新请求无法建立连接

## 快速检查

### 查看当前连接数
\`\`\`sql
-- MySQL
SHOW PROCESSLIST;
SHOW STATUS LIKE 'Threads_connected';

-- MongoDB
db.currentOp()
db.serverStatus().connections
\`\`\`

## 原因分析

1. **连接未正确释放**：代码中忘记关闭连接
2. **连接池配置不合理**：池大小设置过小
3. **慢查询占用连接**：长时间查询霸占连接
4. **连接泄漏**：异常情况下连接未释放

## 解决方案

### 紧急处理
\`\`\`sql
-- 杀死慢查询
KILL <process_id>;
\`\`\`

### 优化配置
\`\`\`javascript
// 数据库连接池配置示例
{
  max: 20,              // 最大连接数
  min: 5,               // 最小连接数
  idle: 10000,          // 空闲连接超时时间
  acquire: 30000,       // 获取连接超时时间
  evict: 1000           // 检查空闲连接间隔
}
\`\`\`

### 代码规范
- 使用 try-finally 确保连接释放
- 实现连接池监控
- 设置连接超时时间

## 监控建议
- 监控数据库连接数
- 设置告警阈值（80%）
- 记录慢查询日志
        `,
        type: KnowledgeType.SOLUTION,
        status: KnowledgeStatus.PUBLISHED,
        category: '数据库',
        tags: ['数据库', '连接池', '故障解决'],
        author: adminUser._id,
        authorName: adminUser.fullName,
        relatedAlerts: ['DatabaseConnectionPoolFull', 'TooManyConnections'],
      },
      {
        title: 'Prometheus 告警规则配置指南',
        summary: '如何配置高质量的 Prometheus 告警规则',
        content: `
## 告警规则设计原则

### 1. 避免告警风暴
- 使用 \`for\` 参数避免瞬时波动
- 合理设置告警阈值
- 实施告警分组和抑制

### 2. 告警要有意义
- 告警应该是可操作的
- 提供足够的上下文信息
- 避免重复告警

## 示例规则

### CPU 使用率告警
\`\`\`yaml
- alert: HighCPUUsage
  expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "服务器 CPU 使用率过高"
    description: "{{ $labels.instance }} CPU 使用率为 {{ $value }}%"
\`\`\`

### 服务宕机告警
\`\`\`yaml
- alert: ServiceDown
  expr: up == 0
  for: 2m
  labels:
    severity: critical
  annotations:
    summary: "服务不可用"
    description: "{{ $labels.job }} 在 {{ $labels.instance }} 上已停止运行超过 2 分钟"
\`\`\`

## 最佳实践

1. **分级告警**
   - critical：需要立即处理
   - warning：需要关注
   - info：信息通知

2. **使用标签**
   - 便于路由和过滤
   - 支持告警分组

3. **提供 Runbook**
   - 在 annotations 中添加处理链接
   - 标准化处理流程

## 测试告警
\`\`\`bash
# 触发测试告警
curl -X POST http://alertmanager:9093/api/v1/alerts -d '[
  {
    "labels": {"alertname": "TestAlert", "severity": "info"},
    "annotations": {"summary": "This is a test alert"}
  }
]'
\`\`\`
        `,
        type: KnowledgeType.RUNBOOK,
        status: KnowledgeStatus.PUBLISHED,
        category: '监控配置',
        tags: ['Prometheus', '告警规则', '配置指南'],
        author: adminUser._id,
        authorName: adminUser.fullName,
      },
    ];

    // 批量创建知识库
    await Knowledge.insertMany(knowledgeData);

    logger.info(`Created ${knowledgeData.length} demo knowledge articles`);
  } catch (error) {
    logger.error('Failed to seed knowledge:', error as Error);
    throw error;
  }
}
